home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_08 / letters / pstring.c < prev    next >
C/C++ Source or Header  |  1994-06-20  |  3KB  |  88 lines

  1. @CSOURCE6 = /*<R>
  2.  * Module: pstring.c (string handling support)<R>
  3.  *    by Martin.Weitzel@rent-a-guru.DE<R>
  4.  */<R>
  5. #include "pstring.h"<R>
  6. #include <<stdarg.h>><R>
  7. #include <<stdlib.h>><R>
  8. #include <<string.h>><R>
  9. /*<R>
  10.  * The macros ALLOC and FREE hide away some casts<R>
  11.  * (necessary to suppress compiler-warnings) and<R>
  12.  * care for pre-ANSI/ISO-C free() which is not<R>
  13.  * guaranteed to be safe for (void *)0-pointers.<R>
  14.  */<R>
  15. #define ALLOC(n, t) ((t *)malloc((n)*(sizeof(t))))<R>
  16. #if __STDC__ == 1<R>
  17. #define FREE(p) free((void *)p)<R>
  18. #else<R>
  19. #define FREE(p) if (p) free((void *)p)<R>
  20. #endif<R>
  21. <R>
  22. /*<R>
  23.  * Concatenate variable number of strings in space<R>
  24.  * allocated from the heap. If no more space is<R>
  25.  * available, the program is aborted.<R>
  26.  */<R>
  27. char *pstr_x(const char *str, ...) {<R>
  28.     const char *cp;    /* tmpry to step over args */<R>
  29.     char *result;    /* tmpry for return value */<R>
  30.     va_list ap;    /* arglist iterator */<R>
  31.     size_t len = 1;    /* total length of strs + 1 */<R>
  32.     /*<R>
  33.      * loop over args, sum length of all strs<R>
  34.      */<R>
  35.     va_start(ap, str);    <R>
  36.     for (cp = str; cp; cp = va_arg(ap, const char *))<R>
  37.         len += strlen(cp);<R>
  38.     va_end(ap);<R>
  39.     /*<R>
  40.      * allocate space for all strs<R>
  41.      */<R>
  42.     if ((result = ALLOC(len, char)) == (char *)0)<R>
  43.         abort();<R>
  44.     result[0] = '\0';<R>
  45.     /*<R>
  46.      * loop over args, concatenate all strs<R>
  47.      */<R>
  48.     va_start(ap, str);    <R>
  49.     for (cp = str; cp; cp = va_arg(ap, const char *))<R>
  50.         (void) strcat(result, cp);<R>
  51.     va_end(ap);<R>
  52.     return result;<R>
  53. }<R>
  54. <R>
  55. /*<R>
  56.  * Helper function for building temporary strings<R>
  57.  * (see "TMPSTR"-macros in "pstring.h" for details).<R>
  58.  * It effectively "schedules a free" delayed by one<R>
  59.  * call to this function, so the caller does not have<R>
  60.  * to care for saving the result of "strmake" in a<R>
  61.  * variable and hand this to free later on.<R>
  62.  * Note: With "(void) tmpstr((char *)0)" you may<R>
  63.  * force to de-allocate the last temporary string<R>
  64.  * build with one of the "TMPSTR"-macros.<R>
  65.  */<R>
  66. char *tmpstr(char *str) {<R>
  67.     static char *laststr;<R>
  68.     FREE(laststr);<R>
  69.     return laststr = str;<R>
  70. }<R>
  71. <R>
  72. /*<R>
  73.  * He<%-2>lper function for copying to pointers initialized<R>
  74. <%0> * by calls to the "pstr_"-function and macros.<R>
  75.  * N<%-2>ote: "pstrcpy" takes the ADDRESS of a char pointer<%0><R>
  76.  * as its first argument and automatic char pointer<R>
  77.  * variables MUST be initialized with (char *)0 prior<R>
  78.  * handing their address to this function the first<R>
  79.  * time.<R>
  80.  */<R>
  81. void pstrcpy(char **destp, const char *src) {<R>
  82.     FREE(*destp);<R>
  83.     *destp = pstr_1(src);<R>
  84. }<R>
  85. <R>
  86. /* End of File */ 
  87.  
  88.